Multiple Testing

Advance Analytics with R (UG 21-24)

Ayush Patel

Before we start

Please load the following packages

library(tidyverse)
library(MASS)
library(ISLR)
library(ISLR2)
library(infer)### get this if you don't



Access lecture slide from bit.ly/aar-ug

Warrior's armor(gusoku)
Source: Armor (Gusoku)

Hello

I am Ayush.

I am a researcher working at the intersection of data, law, development and economics.

I teach Data Science using R at Gokhale Institute of Politics and Economics

I am a RStudio (Posit) certified tidyverse Instructor.

I am a Researcher at Oxford Poverty and Human development Initiative (OPHI), at the University of Oxford.

Reach me

ayush.ap58@gmail.com

ayush.patel@gipe.ac.in

Motivation for Tests for Significance

  • Helps us answer - Is it just chance?
  • Understand and quantify uncertainty and variability.

Helps us make and verify claims about a population using sample estimates.

Helps us make and verify causal claims.

The numbered tickets example

refer: Statistics by David Freedman

Example

Write a simulation that will implement the previous example.

The sex discrimination case study

refer: Intro to Modern Statics

A little about simulation and {infer}

Base

get_diffs <- function(...){
  
  decisions <- ifelse(
  openintro::sex_discrimination$decision == "promoted",
  1,0
)

sample(decisions,
       size = 48,
       replace = F) -> shuffled_decision

mean(shuffled_decision[1:24]) - mean(shuffled_decision[24:48])
  
}

map_dbl(c(1:100), 
        get_diffs)
  [1] -0.05166667 -0.13333333 -0.13333333 -0.21500000 -0.17500000  0.19333333
  [7]  0.07000000 -0.05166667 -0.09333333 -0.09333333 -0.17500000  0.07000000
 [13] -0.21500000  0.07000000  0.27500000 -0.05166667 -0.05166667  0.11166667
 [19] -0.13333333 -0.13333333 -0.05166667  0.03000000  0.27500000 -0.13333333
 [25]  0.11166667  0.27500000 -0.05166667 -0.13333333 -0.01166667 -0.01166667
 [31] -0.21500000 -0.21500000 -0.13333333  0.07000000  0.03000000  0.11166667
 [37] -0.05166667 -0.21500000  0.03000000 -0.25666667  0.11166667  0.03000000
 [43] -0.09333333 -0.05166667  0.07000000  0.15166667 -0.17500000  0.07000000
 [49] -0.05166667 -0.05166667  0.23333333 -0.05166667 -0.29666667 -0.13333333
 [55] -0.17500000  0.11166667 -0.05166667 -0.13333333 -0.13333333  0.27500000
 [61] -0.05166667 -0.13333333 -0.01166667 -0.05166667  0.03000000 -0.13333333
 [67] -0.05166667 -0.05166667  0.15166667  0.07000000 -0.09333333  0.03000000
 [73]  0.27500000  0.11166667 -0.05166667 -0.05166667  0.19333333 -0.01166667
 [79]  0.03000000 -0.37833333  0.15166667 -0.05166667  0.03000000  0.07000000
 [85]  0.07000000  0.11166667 -0.01166667 -0.05166667 -0.13333333  0.19333333
 [91]  0.07000000 -0.17500000  0.11166667 -0.01166667  0.07000000 -0.13333333
 [97] -0.29666667 -0.17500000 -0.21500000  0.03000000

infer

openintro::sex_discrimination|>
  infer::specify(decision ~ sex,
                 success = "promoted")|>
  infer::hypothesise(null = "independence")|>
  infer::generate(reps = 100,
                  type = "permute")|>
  infer::calculate(stat = "diff in props",
                   order = c("male","female"))
Response: decision (factor)
Explanatory: sex (factor)
Null Hypothesis: independence
# A tibble: 100 × 2
   replicate    stat
       <int>   <dbl>
 1         1  0.125 
 2         2 -0.0417
 3         3 -0.0417
 4         4  0.125 
 5         5  0.125 
 6         6  0.208 
 7         7 -0.0417
 8         8  0.0417
 9         9 -0.0417
10        10 -0.0417
# ℹ 90 more rows

Both work fine

but what is convenient

tibble(
  base_diffs = map_dbl(c(1:1000), 
        get_diffs),
  infer_diffs = openintro::sex_discrimination|>
  infer::specify(decision ~ sex,
                 success = "promoted")|>
  infer::hypothesise(null = "independence")|>
  infer::generate(reps = 1000,
                  type = "permute")|>
  infer::calculate(stat = "diff in props",
                   order = c("male","female"))|>
    pull(stat)
) -> differences_in_props

differences_in_props
# A tibble: 1,000 × 2
   base_diffs infer_diffs
        <dbl>       <dbl>
 1    -0.0517      0.0417
 2     0.152       0.0417
 3    -0.297       0.0417
 4    -0.0933      0.0417
 5     0.112       0.208 
 6     0.0300      0.125 
 7     0.0700     -0.292 
 8    -0.175      -0.125 
 9     0.0300      0.0417
10    -0.133       0.125 
# ℹ 990 more rows

Both work fine

Get p-values

Base

map_dbl(
  c(1:1000),
  get_diffs
) >= 0.292 -> greater_equal_obs_stat

greater_equal_obs_stat/1000
   [1] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
  [13] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
  [25] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
  [37] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
  [49] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
  [61] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
  [73] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
  [85] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
  [97] 0.000 0.000 0.000 0.000 0.000 0.001 0.000 0.000 0.000 0.000 0.000 0.000
 [109] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [121] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [133] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [145] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [157] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [169] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [181] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [193] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [205] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [217] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [229] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [241] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [253] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [265] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [277] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [289] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [301] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [313] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.001 0.000 0.000 0.000 0.000
 [325] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [337] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [349] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [361] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [373] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [385] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [397] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [409] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [421] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [433] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [445] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [457] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [469] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [481] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [493] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [505] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [517] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [529] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [541] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [553] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [565] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [577] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [589] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [601] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [613] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.001 0.001 0.000 0.000
 [625] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [637] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [649] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [661] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [673] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [685] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [697] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [709] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [721] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [733] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [745] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [757] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [769] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [781] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [793] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [805] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [817] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [829] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [841] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [853] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [865] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [877] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [889] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [901] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [913] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [925] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [937] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [949] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [961] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [973] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [985] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
 [997] 0.000 0.000 0.000 0.001

infer

  infer_diffs = openintro::sex_discrimination|>
  infer::specify(decision ~ sex,
                 success = "promoted")|>
  infer::hypothesise(null = "independence")|>
  infer::generate(reps = 1000,
                  type = "permute")|>
  infer::calculate(stat = "diff in props",
                   order = c("male","female"))|>
  infer::get_p_value(obs_stat = 0.292,
                     direction = "right")

Exercise

Use both methods for the sex discrimination study, iterate several times. Show that both methods generate similar p-values.